/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo.DAL;

import Modelo.Permiso;

import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.json.JSONObject;

/**
 *
 * @author dayana
 */
public class Permisos_DAO {

    //Variable global que guarda los indices que se liberan al eliminar un objeto perdido
    private static List<Integer> indices = new ArrayList<Integer>();

    public static String obtenerCedula(String nombre1, String apellido1) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        String ci = null;

        String query = "SELECT ci "
                + "FROM comunidad_universitaria "
                + "WHERE UPPER(translate(nombre_1, 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU')) LIKE UPPER(translate('%" + nombre1 + "', 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU'))"
                + " AND UPPER(translate(apellido_1, 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU')) LIKE UPPER(translate('%" + apellido1 + "', 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU'));";

        System.out.println(query);

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando obtenerCedula! " + se.getMessage());
            return null;
        }

        try {
            rs = s.executeQuery(query);

            try {
                int i = 0;
                while (rs.next()) {
                    ci = rs.getString(1);

                }
            } catch (Exception e) {
            }
            return ci;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error Consultando obtenerCedula2 " + se.getMessage());
            return null;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static String obtenerCedula2(String usbid) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        String ci = null;

        String query = "SELECT ci "
                + "FROM personal_usb "
                + "WHERE UPPER(translate(usbid, 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU')) LIKE UPPER(translate('%" + usbid + "', 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU'));";

        System.out.println(query);

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando obtenerCedula2! " + se.getMessage());
            return null;
        }

        try {
            rs = s.executeQuery(query);

            try {
                int i = 0;
                while (rs.next()) {
                    ci = rs.getString(1);

                }
            } catch (Exception e) {
            }
            return ci;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error Consultando obtenerCedula22 " + se.getMessage());
            return null;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public boolean insertarReposo(Permiso permi, boolean sobreVacaciones) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        int aux = permi.getId();
        String query = null;

        if (!indices.isEmpty()) {
            aux = indices.get(0);
            indices.remove(0);
        }

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Insertando Permiso1! " + se.getMessage());
            return false;
        }

        if (sobreVacaciones) {
            query = "INSERT INTO permiso(id_permiso, ci,fecha_inicio, fecha_fin, motivo, infoadicional, sobreVacaciones)"
                    + "VALUES ('" + aux + "','" + permi.getCi() + "','" + permi.getFechaInicio() + "','" + permi.getFechaFin() + "','" + permi.getMotivo() + "','" + (permi.getInfoAdicional()).replace("\\", "\\\\").replace("'", "\\'") + "','true')";
        } else {
            query = "INSERT INTO permiso(id_permiso, ci,fecha_inicio, fecha_fin, motivo, infoadicional)"
                    + "VALUES ('" + aux + "','" + permi.getCi() + "','" + permi.getFechaInicio() + "','" + permi.getFechaFin() + "','" + permi.getMotivo() + "','" + (permi.getInfoAdicional()).replace("\\", "\\\\").replace("'", "\\'") + "')";

        }

        System.out.println(query);
        try {
            s.executeUpdate(query);
            return true;
        } catch (SQLException se) {
            System.out.println("Error Insertando Permiso2! " + se.getMessage());
            return false;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static boolean consultarDisponibilidad(String ci, Date fechaIni, Date fechaFin, String id) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        String query = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error en consultarDisponibilidad! " + se.getMessage());
            return false;
        }

        if (id != null) {//Si no es null estoy modificando un reposo
            query = "SELECT fecha_inicio, fecha_fin FROM PERMISO "
                    + "WHERE PERMISO.ci = '" + ci + "' AND "
                    + "id_permiso<>'" + id + "';";
        } else {//SI es null estoy agregando un reposo
            query = "SELECT fecha_inicio, fecha_fin FROM PERMISO "
                    + "WHERE PERMISO.ci = '" + ci + "';";
        }

        System.out.println(query);
        try {
            rs = s.executeQuery(query);
            while (rs.next()) {

                if (fechaIni.equals(rs.getDate(1)) || fechaFin.equals(rs.getDate(2))
                        || fechaIni.equals(rs.getDate(2)) || fechaFin.equals(rs.getDate(1))
                        || (fechaIni.before(rs.getDate(1)) && fechaFin.after(rs.getDate(2)))
                        || (fechaIni.after(rs.getDate(1)) && fechaFin.before(rs.getDate(2)))
                        || (fechaIni.before(rs.getDate(1)) && fechaFin.after(rs.getDate(1)))
                        || (fechaIni.before(rs.getDate(2))) && fechaFin.after(rs.getDate(2))) {
                    return false;
                }
            }
            return true;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error al consultarDisponibilidad2");
            return false;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static boolean consultarReposos(String ci, Date fechaIni, Date fechaFin, String id) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        String query = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error en consultarDisponibilidad! " + se.getMessage());
            return false;
        }

        if (id != null) {//Si no es null estoy modificando un reposo
            query = "SELECT fecha_inicio, fecha_fin FROM PERMISO "
                    + "WHERE PERMISO.ci = '" + ci + "' AND "
                    + " motivo='reposo' "
                    + "AND id_permiso<>'" + id + "';";
        } else {//SI es null estoy agregando un reposo
            query = "SELECT fecha_inicio, fecha_fin FROM PERMISO "
                    + "WHERE PERMISO.ci = '" + ci + "' AND "
                    + "motivo='reposo';";
        }

        System.out.println(query);
        try {
            rs = s.executeQuery(query);
            while (rs.next()) {
                System.out.println("FechaIni " + fechaIni + " FechaFin" + fechaFin + " " + fechaIni.equals(rs.getDate(1)));
                System.out.println("- " + rs.getDate(1) + " " + rs.getDate(2));
                if (fechaIni.equals(rs.getDate(1)) || fechaFin.equals(rs.getDate(2))
                        || fechaIni.equals(rs.getDate(2)) || fechaFin.equals(rs.getDate(1))
                        || (fechaIni.before(rs.getDate(1)) && fechaFin.after(rs.getDate(2)))
                        || (fechaIni.after(rs.getDate(1)) && fechaFin.before(rs.getDate(2)))
                        || (fechaIni.before(rs.getDate(1)) && fechaFin.after(rs.getDate(1)))
                        || (fechaIni.before(rs.getDate(2))) && fechaFin.after(rs.getDate(2))) {
                    return false;
                }
            }
            return true;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error al consultarDisponibilidad2");
            return false;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static JSONObject listarAll(String ci, String where) {
        ConexionBD conex = new ConexionBD();
        JSONObject reposos = new JSONObject();

        try {
            Statement st = (Statement) conex.session.createStatement();
            String query = "SELECT id_permiso, permiso.ci, nombre_1, apellido_1, motivo, fecha_inicio, fecha_fin, infoadicional, vacaciones_pendientes, "
                    + "(Select count(*) FROM permiso, comunidad_universitaria "
                    + "WHERE permiso.ci='" + ci + "' AND comunidad_universitaria.ci=permiso.ci AND permiso.ci=vacaciones_personal.ci) "
                    + "FROM permiso, comunidad_universitaria, vacaciones_personal "
                    + "WHERE permiso.ci='" + ci + "' AND comunidad_universitaria.ci=permiso.ci AND permiso.ci=vacaciones_personal.ci "
                    + "ORDER BY fecha_inicio"
                    + where + ";";
            ResultSet rs = st.executeQuery(query);

            System.out.println(query);

            int i = 0;
            while (rs.next()) {
                JSONObject reposo = new JSONObject();
                reposo.put("id", rs.getString(1));
                reposo.put("ci", rs.getString(2));
                reposo.put("nombre", rs.getString(3));
                reposo.put("apellido", rs.getString(4));
                reposo.put("condicion", rs.getString(5));

                String desde = rs.getString(6);
                reposo.put("desde", desde.substring(8, 10) + "/"
                        + desde.substring(5, 7) + "/"
                        + desde.substring(0, 4));

                String hasta = rs.getString(7);
                reposo.put("hasta", hasta.substring(8, 10) + "/"
                        + hasta.substring(5, 7) + "/"
                        + hasta.substring(0, 4));

                reposo.put("infoAdicional", rs.getString(8));
                reposo.put("vacaciones", rs.getString(9));
                // ojo con lo de abajo
                reposo.put("tam", rs.getString(10));
                reposos.put("" + i++, reposo);
            }
        } catch (Exception e) {
            System.out.println("Excepcion: " + e);
        }
        return reposos;
    }

    public static List<Permiso> consultarPermisos(String ci) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;

        String query = "SELECT id_permiso, permiso.ci, nombre_1, apellido_1, motivo, fecha_inicio, fecha_fin, infoadicional, vacaciones_pendientes "
                + "FROM permiso, comunidad_universitaria, vacaciones_personal "
                + "WHERE permiso.ci='" + ci + "' AND comunidad_universitaria.ci=permiso.ci AND permiso.ci=vacaciones_personal.ci "
                + "ORDER BY fecha_inicio;";

        System.out.println(query);

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando Permisos! " + se.getMessage());
            return null;
        }

        try {
            rs = s.executeQuery(query);

            List<Permiso> permisos = new ArrayList();
            try {
                int i = 0;
                while (rs.next()) {
                    Permiso permi = new Permiso(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getDate(6), rs.getDate(7), rs.getString(8), rs.getInt(9));
                    permisos.add(permi);
                }
            } catch (Exception e) {
            }
            return permisos;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error Consultando Permisos2 " + se.getMessage());
            return null;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    //Retorna el numero de vacaciones pendientes.
    public static long tieneVacaciones(String ci, Date C, Date D) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        Date A, B;
        long dias = 0;


        String query = "SELECT fecha_inicio, fecha_fin "
                + "FROM permiso "
                + "WHERE ci='" + ci + "' "
                + "AND motivo='vacaciones';";

        System.out.println(query);

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando tieneVacaciones! " + se.getMessage());
            return 0;
        }

        try {
            rs = s.executeQuery(query);

            try {
                while (rs.next()) {

                    A = rs.getDate(1);
                    B = rs.getDate(2);
                    //if (A<=C && D<=B) then "estoy dentro dle intervalo de vacaciones"
                    if ((A.before(C) || A.equals(C)) && (D.before(B) || D.equals(B))) {
                        dias = obtenerDias(C, D) + 1;
                        System.out.println("DIAS Vacaciones: " + dias);

                        query = "SELECT vacaciones_pendientes FROM vacaciones_personal"
                                + " WHERE ci='" + ci + "';";

                        try {
                            rs = s.executeQuery(query);
                            while (rs.next()) {
                                dias = dias + rs.getInt(1);
                                System.out.println("DIAS Nuevos: " + dias);
                            }
                        } catch (Exception e) {
                            System.out.println("Excepcion " + e);
                        }


                        query = "UPDATE vacaciones_personal SET vacaciones_pendientes = '" + dias
                                + "' WHERE ci='" + ci + "';";

                        try {
                            rs = s.executeQuery(query);
                        } catch (Exception e) {
                            System.out.println("Excepcion " + e);
                        }
                    }


                }
            } catch (Exception e) {
                System.out.println("Excepcion " + e);
            }
            return dias;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error Consultando tieneVacaciones2 " + se.getMessage());
            return 0;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static String eliminarPermiso(int id) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        String ci = "0";
        String motivo = null;
        boolean sobreVacacion = false;
        Date fechaInicio = null;
        Date fechaFin = null;
        long dias = 0;
        long diasPendientes = 0;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Eliminando Permiso1! " + se.getMessage());
            return "0";
        }
        String query = "SELECT ci, motivo, sobreVacaciones, fecha_inicio, fecha_fin FROM permiso WHERE id_permiso='" + id + "';";
        String query2 = "DELETE FROM permiso WHERE id_permiso='" + id + "';";

        System.out.println(query);
        System.out.println(query2);
        try {
            rs = s.executeQuery(query);
            while (rs.next()) {
                ci = rs.getString(1);
                motivo = rs.getString(2);
                sobreVacacion = rs.getBoolean(3);
                fechaInicio = rs.getDate(4);
                fechaFin = rs.getDate(5);
            }

            diasPendientes = obtenerVacacionesPendientes(ci);
            System.out.println("DIAS PENDIENTES: " + diasPendientes);
            s.executeUpdate(query2);
            indices.add(id);

            if (motivo.equals("reposo") && (sobreVacacion == true)) {
                dias = diasPendientes - (obtenerDias(fechaInicio, fechaFin) +1);
    System.out.println("DIAS : " + obtenerDias(fechaInicio, fechaFin));
                query = "UPDATE vacaciones_personal SET vacaciones_pendientes = '" + dias
                        + "' WHERE ci='" + ci + "';";
                System.out.println(query);

                try {
                    s.executeUpdate(query);
                } catch (Exception e) {
                    System.out.println("Excepcion " + e);
                }
            }

            return ci;
        } catch (SQLException se) {
            System.out.println("Error Eliminando Permiso2! " + se.getMessage());
            return "0";
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static boolean modificarPermiso(String id, String ci, String motivo, String desde, String hasta, String info) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Modificando Permiso1! " + se.getMessage());
            return false;
        }
        String query = "UPDATE permiso SET motivo = '" + motivo + "' , fecha_inicio = '" + desde + "' , fecha_fin = '" + hasta + "' , infoAdicional = '" + info.replace("\\", "\\\\").replace("'", "\\'")
                + "' WHERE id_permiso='" + id + "';";

        System.out.println(query);
        try {
            s.executeUpdate(query);
            return true;
        } catch (SQLException se) {
            System.out.println("Error modificando Permiso2! " + se.getMessage());
            return false;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    //Esta funcion devuelve la cantidad de entradas que tiene la tabla objeto_perdido
    public String obtenerUltimoIndice() {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Obteniendo Ultimo Indice! " + se.getMessage());
            return null;
        }
        String query = "SELECT count(*) FROM permiso;";

        System.out.println(query);
        try {
            rs = s.executeQuery(query);

            rs.next();

            return rs.getString(1);

        } catch (SQLException se) {
            System.out.println("Error Obteniendo Ultimo Indice! " + se.getMessage());
            return null;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static long obtenerDias(Date C, Date D) {

        //Realizo la operación
        long time = D.getTime() - C.getTime();

        //Muestro el resultado en días
        return time / (3600 * 24 * 1000);
    }

    public static long obtenerVacacionesPendientes(String ci) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        long dias = 0;

        String query = "SELECT vacaciones_pendientes "
                + "FROM vacaciones_personal "
                + "WHERE ci='" + ci + "';";

        System.out.println(query);

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error obtenerVacacionesPendientes! " + se.getMessage());
            return -1;
        }

        try {
            rs = s.executeQuery(query);

            try {
                while (rs.next()) {
                    dias = rs.getLong(1);
                }
            } catch (Exception e) {
            }
            return dias;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error obtenerVacacionesPendientes2 " + se.getMessage());
            return -1;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }
}
